/*
 * @Author: Wangjun
 * @Date: 2021-05-15 22:46:27
 * @LastEditTime: 2025-04-17 16:51:43
 * @LastEditors: wangjun haodreams@163.com
 * @Description:
 * @FilePath: \libd:\go\src\gitee.com\haodreams\godriver\opdb\table.go
 * hnxr
 */
package opdb

import (
	"fmt"

	opio "gitee.com/haodreams/godriver/opdb/opio/driver"
)

// openplant 质量
const (
	OPGood = 0x0
	OPPoor = 0x200
	OPBad  = 0x300

	OPTimeout = 0x8000
)

// Valuer 实时数据,历史数据接口
type Valuer interface {
	GetName() string
	GetID() int64
	GetValue() float64
	GetStatus() int
	GetTime() float64
	GetUnixTime() int64
}

// Archive 历史表
type Archive Real

// BuildMax 获取最大值
func (m *Archive) BuildMax(begin, end int) string {
	return ""
}

// TableName 历史库表名
func (m *Archive) TableName() string {
	return "Archive"
}

// Point 静态信息表
type Point struct {
	ID   int    `gorm:"PRIMARY_KEY;column:ID"` //id
	Type int    `gorm:"column:RT"`             //类型
	Name string `gorm:"column:GN"`             //点名
	Desc string `gorm:"column:ED"`             //描述
	EU   string `gorm:"column:EU"`             //单位
	KR   string `gorm:"column:KR"`             //特征字
	FM   int    `gorm:"column:FM"`             //小数位数
}

type Node struct {
	ID   int    `gorm:"PRIMARY_KEY;column:ID"`
	Name string `gorm:"column:GN"`
	Desc string `gorm:"column:ED"`
}

/**
 * @description:查询需要用到的字段，用空格分割
 * @return {*}
 */
func (m *Point) GetColumnNames() string {
	return "ID RT GN ED KR"
}

func (m *Point) GetType() string {
	switch int8(m.Type) {
	case opio.TypeAX:
		return "AX"
	case opio.TypeDX:
		return "DX"
	case opio.TypeI2:
		return "I2"
	case opio.TypeI4:
		return "I4"
	case opio.TypeR8:
		return "R8"
	case opio.TypeI8:
		return "I8"
	case opio.TypeTX:
		return "TEXT"
	case opio.TypeBN:
		return "BIN"
	}
	return fmt.Sprint(m.Type)
}

// Real 实时表
type Real struct {
	ID     int     `gorm:"PRIMARY_KEY;column:ID"`
	Name   string  `gorm:"column:GN"`
	Value  float64 `gorm:"column:AV"`
	Status int16   `gorm:"column:DS"`
	Time   int64   `gorm:"column:TM"`
}

type Binary struct {
	ID     int    `gorm:"PRIMARY_KEY;column:ID"`
	Name   string `gorm:"column:GN"`
	Value  []byte `gorm:"column:AV"`
	Status int16  `gorm:"column:DS"`
	Time   int64  `gorm:"column:TM"`
}

// IsTimeout 是否超时
func (m *Real) IsTimeout() bool {
	return m.Status < 0
}

// TableName 实时库表名
func (m *Real) TableName() string {
	return "Realtime"
}

// GetName .
func (m *Real) GetName() string {
	return m.Name
}

// GetID .
func (m *Real) GetID() int64 {
	return int64(m.ID)
}

// GetValue .
func (m *Real) GetValue() float64 {
	return m.Value
}

// GetStatus .
func (m *Real) GetStatus() int {
	return int(m.Status)
}

// GetTime .
func (m *Real) GetTime() float64 {
	return float64(m.Time)
}

// GetUnixTime .
func (m *Real) GetUnixTime() int64 {
	return m.Time
}

// GetQuality .
func (m *Real) GetQuality() string {
	switch {
	case m.Status == 0:
		return "Good"
	case m.Status < 0:
		return "Timeout"
	}
	return fmt.Sprint(m.Status)
}
